﻿#pragma once
#include <string>
#include <list>
#include <memory>
#include <vector>

#include "scheme_def.h"

// 这是一个方案的头文件，用于定义五笔方案管理

class WordDic;
class WubiDb;

class WubiSchemeMgr {
public:
    WubiSchemeMgr();
    ~WubiSchemeMgr();

    bool init(const std::string &db_path = "./mengyu_wubi.db"); //初始化,db_path是数据库文件路径
    bool release(); //释放资源

    bool getSchemes(std::vector<WubiBaseInfoPtr> &out_schemes); //获取所有的方案信息列表
    bool getCodeTables(MengYuIDType scheme_id , std::vector<WubiBaseInfoPtr> &out_tables); //获取一个方案的所有码表信息列表

    MengYuIDType createScheme(const std::string& name); //创建一个方案,返回方案id为0 表示失败
    bool deleteScheme(MengYuIDType id); //删除一个方案
    // 方案更新
    bool updateScheme(MengYuIDType schemeId, const std::string& name, int candidateCount);
    bool getSchemeInfo(MengYuIDType scheme_id, WubiBaseInfo &out_scheme); //获取一个方案的信息

    // 交换码表顺序
    bool swapCodeTableOrder(MengYuIDType codeTableId1, MengYuIDType codeTableId2);

     //添加一个码表到方案中,返回码表id为0 表示失败
    MengYuIDType addCodeTable(MengYuIDType scheme_id, const std::string& name,const std::string &file_path);
    bool removeCodeTable(MengYuIDType scheme_id, MengYuIDType code_table_id); //从方案中移除一个码表
    
    MengYuIDType getCurrentSchemeId(); //获取当前使用的方案id
    int getCurrentCandidateCount(); //获取当前使用的方案的候选词数量
    bool setCurrentSchemeId(MengYuIDType id); //设置当前使用的方案id,会重新加载当前方案字典

    //根据编码获取码表数据
    bool getCodeTableDataByCode(MengYuIDType codeTableId, const std::string &code, std::vector<WubiCodetableData> &out_data);
    // 交换两的个码表词条的顺序
    bool swapCodeTableDataOrder(MengYuIDType codeTableId, MengYuIDType code_id1, MengYuIDType code_id2);

    // 词库管理
    MengYuIDType addWord(MengYuIDType codeTableId, const std::string& code, const std::string& word);
    bool removeWord(MengYuIDType code_id);

    //设置码表启用
    bool setCodeTableEnable(MengYuIDType codeTableId, bool enable);


    bool reloadWordDic(); //重新加载当前方案字典

    //获取候选词列表,从_word_dic中获取,code是五笔码,out_list是候选词列表
    bool getCandidateList(const std::string &code, std::vector<std::string> &out_list);

    //编码反查，根据词获取所有启用码表的编码,
    bool getCodeByWord(const std::string &word,std::vector<std::string> &out_codes);

    //导出码表
    bool exportCodeTable(MengYuIDType codeTableId, const std::string &file_path);
private:
    WubiBaseInfo _current_scheme; //当前使用的方案
    std::shared_ptr<WordDic> _word_dic; //当前使用方案的字典，用于查询候选词
    std::shared_ptr<WubiDb> _db; //数据库对象，用于操作数据库，管理方案和码表信息
    std::string _db_path; //数据库文件路径
    bool _can_worddic_work; //码表是否可以工作
};